package org.upm;

/**
 * Clase que dispara la reglas necesarias para clasificar una serie de anuncios.
 * 
 * @author Jonathan Gonzalez
 * @version 09/03/2009
 */
public class ClasificadorAnuncios {
	
	/**
	 * Constructor de la clase.
	 */
	public ClasificadorAnuncios(){
	}
	
	/**
	 * Metodo que invoca las reglas para clasificar anuncios
	 * @param anuncios - anuncios a clasificar.
	 * @throws Exception
	 */
	public void clasificaAnuncios(Object[] anuncios) throws Exception{
		new RuleRunner().runRules( new String[] { "ClasificacionAnuncios.drl" }, anuncios );		
	}
	
	/**
	 * Método que invoca las reglas para puntuar a los anuncios segun el llamante y
	 * elige de acuerdo a eso el anuncio más adecuado.
	 * @param llamante - Usuario que genera la llamada.
	 * @param anuncios - Anuncios del sistema
	 * @throws Exception
	 */
	public Anuncio seleccionaAnuncio(Usuario llamante, Object[] anuncios) throws Exception{
		Object[] facts = new Object[anuncios.length + 1];
		facts[0] = llamante;
		for( int i = 0; i < anuncios.length; i++){
			facts[i+1] = anuncios[i];
		}
		new RuleRunner().runRules( new String[] { "ReglasServicio.drl" }, facts );
		//Seleccionamos el mejor anuncio según el Rating de cada 1.
		GeneradorAnuncios ga = new GeneradorAnuncios();
		Anuncio bestMatch = ga.dameAnuncioDefecto();
		for ( int i = 0; i < anuncios.length; i++ ) {	
			if (anuncios[i] instanceof Anuncio){
				Anuncio temporal = (Anuncio) anuncios[i];
	            if (temporal.getRating() > bestMatch.getRating()){
	               bestMatch = temporal;
	            }
			}	
        }
		if (bestMatch.getRating() >= 0){
		    System.out.println("**** Mejor anuncio para " + llamante.getNombre() +
		    		    " es "+ bestMatch.getNombre() + " Con Rating " + 
		    		    bestMatch.getRating());
		    for ( int i = 0; i < anuncios.length; i++ ) {	
				if (anuncios[i] instanceof Anuncio){
					Anuncio tmp = (Anuncio)anuncios[i];
					tmp.setRating(0);
				}	
	        }
		    return bestMatch;
		}
		else{
			System.out.println("No hay anuncios adecuados, servir anuncio por defecto");
			return ga.dameAnuncioDefecto();
		}
	}
}
